﻿/*** Feito por Cristian de Oliveira Rodrigues ***/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
using System.Reflection;

namespace PhysicsFmuDeluxeDotNet
{
    public partial class Vetores : Form
    {
        public Vetores()
        {
            InitializeComponent();
        }

        private void btnGrafico_Click(object sender, EventArgs e)
        {
            //Variáveis para soma
            double vetoriA, vetorjA;
            double vetoriB, vetorjB;
            double vetoriC, vetorjC;
            double vetoriD, vetorjD;
            double vetoriE, vetorjE;
            double vetoriSoma, vetorjSoma;

            //Variáveis para a checagem dos números inseridos. Se for um caracter que não seja número, retornar mensagem de aviso.
            bool checagemiA, checagemjA;
            bool checagemiB, checagemjB;
            bool checagemiC, checagemjC;
            bool checagemiD, checagemjD;
            bool checagemiE, checagemjE;

            //Algorítmo da checagem. Se o que o usuário digitar for um número válido, checagemiX/checagemjX recebe true e o valor número é armazenado em vetoriX/vetorjX
            //caso contrário, checagemiX recebe false e nada é repassado para vetoriX/vetorjX
            checagemiA = double.TryParse(txtiA.Text, out vetoriA);
            checagemjA = double.TryParse(txtjA.Text, out vetorjA);

            checagemiB = double.TryParse(txtiB.Text, out vetoriB);
            checagemjB = double.TryParse(txtjB.Text, out vetorjB);

            checagemiC = double.TryParse(txtiC.Text, out vetoriC);
            checagemjC = double.TryParse(txtjC.Text, out vetorjC);

            checagemiD = double.TryParse(txtiD.Text, out vetoriD);
            checagemjD = double.TryParse(txtjD.Text, out vetorjD);

            checagemiE = double.TryParse(txtiE.Text, out vetoriE);
            checagemjE = double.TryParse(txtjE.Text, out vetorjE);

            //Ester Egg: Se o txtiA estiver com a palavra "sobre" escrito, mostrar caixa de diálogo sobre
            if (txtiA.Text.ToLower() == "sobre")
            {
                SobrePrincipal sobre = new SobrePrincipal();
                sobre.ShowDialog();
            }

            //Ester Egg: Se o txtiA estiver com a palavra "agradecimentos" escrito, mostrar caixa de diálogo agraecimentos
            else if (txtiA.Text.ToLower() == "agradecimentos")
            {
                Agradecimentos agradecimentos = new Agradecimentos();
                agradecimentos.ShowDialog();
            }

            //Se alguma checagem receber false, exibir uma mensagem na tela alertando o usuário a confirmar os dados
            else if (checagemiA == false || checagemjA == false || checagemiB == false || checagemjB == false || checagemiC == false || checagemjC == false || checagemiD == false || checagemjD == false || checagemiE == false || checagemjE == false)
            {
                ConfirmarDados alerta = new ConfirmarDados();
                alerta.ShowDialog();
            }

            //Se nenhuma checagem falhar, continuar com o código
            else
            {
                //Redimensionar form (aumentar sua altura para 590 pixels)
                Vetores.ActiveForm.Size = new Size(Vetores.ActiveForm.Size.Width, 590);

                //Centralizar form. Fórmula: (largura da tela - largura do programa) / 2, (altura da tela - altura do programa) / 2)
                Vetores.ActiveForm.Location = new Point((Screen.PrimaryScreen.Bounds.Width - Vetores.ActiveForm.Size.Width) / 2, (Screen.PrimaryScreen.Bounds.Height - Vetores.ActiveForm.Size.Height) / 2);

                /*** Soma dos vetores ***/
                //Valor mínimo do vetor soma será sempre o valor do vetor A
                vetoriSoma = vetoriA;
                vetorjSoma = vetorjA;

                //Se a opcao Soma estiver selecionada, somar B
                if ((string)cbSinalA.SelectedItem == "Soma")
                {
                    vetoriSoma += vetoriB;
                    vetorjSoma += vetorjB;
                }

                //Se a opcao Subtração estiver selecionada, subtrair B
                else if ((string)cbSinalA.SelectedItem == "Subtração")
                {
                    vetoriSoma -= vetoriB;
                    vetorjSoma -= vetorjB;
                }

                //Se a opcao Soma estiver selecionada, somar C
                if ((string)cbSinalB.SelectedItem == "Soma")
                {
                    vetoriSoma += vetoriC;
                    vetorjSoma += vetorjC;
                }

                //Se a opção subtração estiver selecionada, subtrair C
                else if ((string)cbSinalB.SelectedItem == "Subtração")
                {
                    vetoriSoma -= vetoriC;
                    vetorjSoma -= vetorjC;
                }

                //Se a opção soma estiver selecionada, somar D
                if ((string)cbSinalC.SelectedItem == "Soma")
                {
                    vetoriSoma += vetoriD;
                    vetorjSoma += vetorjD;
                }

                //Se a opção subtração estiver selecionada, subtrair D
                else if ((string)cbSinalC.SelectedItem == "Subtração")
                {
                    vetoriSoma -= vetoriD;
                    vetorjSoma -= vetorjD;
                }

                //Se a opção soma estiver selecionada, somar E
                if ((string)cbSinalD.SelectedItem == "Soma")
                {
                    vetoriSoma += vetoriE;
                    vetorjSoma += vetorjE;
                }

                //Se a opção Substração estiver selecionada, subtrair E
                else if ((string)cbSinalD.SelectedItem == "Subtração")
                {
                    vetoriSoma -= vetoriE;
                    vetorjSoma -= vetorjE;
                }

                //Deixar os campos de resultado visíveis
                lblSomaResultado.Visible = true;
                txtSomaResultado.Visible = true;

                //Setar o valor do resultado em txtSomaResultado.Text
                //Se positivo ou = 0, colocar o sinal de +
                if (vetorjSoma >= 0)
                {
                    txtSomaResultado.Text = Math.Round(vetoriSoma, 3).ToString() + "î+" + Math.Round(vetorjSoma, 3).ToString() + "ĵ";
                }

                //senão, nao botar o sinal de +
                else
                {
                    txtSomaResultado.Text = Math.Round(vetoriSoma, 3).ToString() + "î" + Math.Round(vetorjSoma, 3).ToString() + "ĵ";
                }

                /*** Fim da soma de vetores ***/

                /*** Módulo do vetor resultante ***/
                double vetorModulo;

                vetorModulo = Math.Sqrt(Math.Pow(vetoriSoma, 2) + Math.Pow(vetorjSoma, 2));

                lblModulo.Visible = true;
                txtModulo.Visible = true;

                txtModulo.Text = Math.Round(vetorModulo, 10).ToString();

                /*** Fim do módulo do vetor resultante ***/

                /*** Ângulo formado pelo vetor resultante no gráfico ***/
                double anguloVetor;

                //Angulo de j/i em RADIANOS
                anguloVetor = Math.Atan2(vetorjSoma, vetoriSoma);

                //Conversao de radianos para graus
                anguloVetor = anguloVetor * 180 / Math.PI;

                //Solução para o problema do angulo ser exibido em negativo invés do usual (exemplo: 270 graus é exibido como -90 graus)
                if (vetorjSoma < 0)
                {
                    anguloVetor += 360;
                }

                //Deixar os campos lblAngulo e txtAngulo visiveis
                lblAngulo.Visible = true;
                txtAngulo.Visible = true;

                //Setar o angulo no txtAngulo.text
                txtAngulo.Text = Math.Round(anguloVetor, 10).ToString();

                /*** Fim do algorítmo para exibição e cálculo do ângulo ***/

                /*** Gráfico XY dos vetores. Feito usando o ZedGraph. Página: http://zedgraph.org/wiki/index.php?title=Main_Page ***/
                //Pegar a referencia do painel do controle de gráfico graficoXY
                GraphPane painelVetorResultante = graficoXY.GraphPane;

                //Limpar todos os gráficos atuais, para reexibição, caso o usuário calcule um novo vetor resultante
                painelVetorResultante.CurveList.Clear();

                //Setar o título do painel
                painelVetorResultante.Title.Text = "Gráfico dos vetores";

                //Setar o ponto para o desenho da linha do gráfico (de todos os vetores)
                PointPairList listaVetorAXY = new PointPairList();
                PointPairList listaVetorBXY = new PointPairList();
                PointPairList listaVetorCXY = new PointPairList();
                PointPairList listaVetorDXY = new PointPairList();
                PointPairList listaVetorEXY = new PointPairList();
                PointPairList listaVetorResultanteXY = new PointPairList();

                //Vetor A
                listaVetorAXY.Add(0, 0);             //Posição inicial do ponto
                listaVetorAXY.Add(vetoriA, vetorjA); //Posição final do ponto

                //Vetor B
                listaVetorBXY.Add(0, 0);             //Posição inicial do pornto
                listaVetorBXY.Add(vetoriB, vetorjB); //Posição final do ponto

                //Vetor C
                listaVetorCXY.Add(0, 0);             //Posição inicial do pornto
                listaVetorCXY.Add(vetoriC, vetorjC); //Posição final do ponto

                //Vetor D
                listaVetorDXY.Add(0, 0);             //Posição inicial do pornto
                listaVetorDXY.Add(vetoriD, vetorjD); //Posição final do ponto

                //Vetor E
                listaVetorEXY.Add(0, 0);             //Posição inicial do pornto
                listaVetorEXY.Add(vetoriE, vetorjE); //Posição final do ponto

                //Vetor Resultante
                listaVetorResultanteXY.Add(0, 0);                   //Posição inicial do pornto
                listaVetorResultanteXY.Add(vetoriSoma, vetorjSoma); //Posição final do ponto

                //Gerar uma linha com o ponto em formato de um diamante, e com o nome de "Vetor A"
                LineItem linhaVetorA = painelVetorResultante.AddCurve("Vetor A", listaVetorAXY, System.Drawing.Color.Red, SymbolType.Diamond);

                //Gerar uma linha com o ponto em formato de um diamante, e com o nome de "Vetor B"
                LineItem linhaVetorB = painelVetorResultante.AddCurve("Vetor B", listaVetorBXY, System.Drawing.Color.Violet, SymbolType.Diamond);

                //Gerar uma linha com o ponto em formato de um diamante, e com o nome de "Vetor C"
                LineItem linhaVetorC = painelVetorResultante.AddCurve("Vetor C", listaVetorCXY, System.Drawing.Color.Turquoise, SymbolType.Diamond);

                //Gerar uma linha com o ponto em formato de um diamante, e com o nome de "Vetor D"
                LineItem linhaVetorD = painelVetorResultante.AddCurve("Vetor D", listaVetorDXY, System.Drawing.Color.YellowGreen, SymbolType.Diamond);

                //Gerar uma linha com o ponto em formato de um diamante, e com o nome de "Vetor E"
                LineItem linhaVetorE = painelVetorResultante.AddCurve("Vetor E", listaVetorEXY, System.Drawing.Color.PowderBlue, SymbolType.Diamond);

                //Gerar uma linha com o ponto em formato de um diamante, e com o nome de "Vetor Resultante"
                LineItem linhaVetorResultante = painelVetorResultante.AddCurve("Vetor Resultante", listaVetorResultanteXY, System.Drawing.Color.Blue, SymbolType.Diamond);

                //Preencher o simbolo diamante do vetor resultante com a cor azul e aumentar seu tamanho
                linhaVetorResultante.Symbol.Fill = new Fill(Color.Blue);
                linhaVetorResultante.Symbol.Size += 3;

                //Mostrar o grid no grafico xy
                painelVetorResultante.XAxis.MajorGrid.IsVisible = true;
                painelVetorResultante.YAxis.MajorGrid.IsVisible = true;

                //Mostrar pontos quando passar o mouse sobre eles
                graficoXY.IsShowPointValues = true;

                //Desenhar o gráfico e setar ele como visível
                graficoXY.AxisChange();
                graficoXY.Invalidate();
                graficoXY.Visible = true;
            }
        }

        //Ao carregar o forumulário, realizar esse código
        private void Principal_Load(object sender, EventArgs e)
        {
            //Nada será realizado na inicialização do form
        }   

        /*** Eventos que destravam os campos de texto e combo boxes ***/
        private void cbSinalA_SelectionChangeCommitted(object sender, EventArgs e)
        {
            txtiB.Enabled = true;
            txtjB.Enabled = true;
            cbSinalB.Enabled = true;
        }

        private void cbSinalB_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtiC.Enabled = true;
            txtjC.Enabled = true;
            cbSinalC.Enabled = true;
        }

        private void cbSinalC_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtiD.Enabled = true;
            txtjD.Enabled = true;
            cbSinalD.Enabled = true;
        }

        private void cbSinalD_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtiE.Enabled = true;
            txtjE.Enabled = true;
        }
        /*** Fim dos eventos que destravam os campos de texto e combo boxes ***/

        /*** Menu principal do programa ***/
        //Agradecimentos
        private void agradecimentosToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Agradecimentos agradecimentos = new Agradecimentos();
            agradecimentos.ShowDialog();
        }

        //Página sobre vetores
        private void vetoresToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://educar.sc.usp.br/fisica/vetores.html");
        }

        //Página sobre Trigonometria
        private void trigonometriaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://pessoal.sercomtel.com.br/matematica/trigonom/trigonometria.htm");
        }

        //Página do ZedGraph (engine de gráficos usada no programa)
        private void zedGraphToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://zedgraph.org/wiki/index.php?title=Main_Page");
        }

        //Página do Professor André
        private void páginaDoProfessorAndréToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.lapolli.pro.br/");
        }

        /*** Itens do menu de contexto ***/
        //Agradecimentos
        private void agradecimentosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Agradecimentos dialogoAgradecimentos = new Agradecimentos();
            dialogoAgradecimentos.ShowDialog();
        }

        //Ajuda
        private void ajudaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Ajuda ajudaPDF = new Ajuda();
            ajudaPDF.Show();
        }

        //Exemplo de código-fonte
        private void exemploDeCódigoFonteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CodigoFonte codigoFonte = new CodigoFonte();
            codigoFonte.Show();
        }

        //Fechar janela
        private void fecharToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        /*** Fim dos itens do menu de contexto ***/
        /*** Fim do Menu Principal do Programa ***/
    }
}

/*** Feito por Cristian de Oliveira Rodrigues ***/
